package br.ufrj.dcc.tp.servidor.interfaces;

import java.io.IOException;
import java.util.List;

import br.ufrj.dcc.tp.servidor.model.exception.ServerException;
import br.ufrj.dcc.tp.utils.interfaces.ISocketMessage;

/**
 * Interface de notificao de eventos entre cliente/servidor
 */
public interface INotifier {
	
	/**
	 * Retorna um Cliente baseado em seu nome.
	 * @param nome
	 * @return
	 */
	public IClient getSubscribe(String nome);
	
	/**
	 * Registra um cliente para escutar os eventos do servidor.
	 * @param client
	 * @throws Exception
	 */
	public void subscribe(IClient client) throws ServerException, IOException;
	
	/**
	 * Remove um cliente 
	 * @param cliente
	 * @throws Exception
	 */
	public void unsubscribe(IClient cliente, boolean notify) throws ServerException, IOException;
	/** Desconecta todos os clientes. */
	public void unsubscribeAll();
	/**Entrega mensagens a seus respectivos destinatarios.*/
	public void update(ISocketMessage message);
	public List<String> getSubscriptions();
	// Avisa os clientes que a lista de clientes foi alterada.
	public void notifySubscriptionsChange(IClient client, String eventName);
	/** Retorna o numero de clientes. */
	public int getNumClients();
}
